//#include <iostream>
//using namespace std;
//
//void Func(char str[100])
//{
//	cout << sizeof(str) << endl;
//}
//
//int main()
//{
//	char str[100];
//	Func(str);
//	/*char str1[] = "abc";
//	char str2[] = "abc";
//	const char str3[] = "abc";
//	const char str4[] = "abc";
//	const char* str5 = "abc";
//	const char* str6 = "abc";
//	cout << (str1 == str2) << endl;
//	cout << (str3 == str4) << endl;
//	cout << (str5 == str6) << endl;*/
//	return 0;
//}

//#include <iostream>
//#include <thread>
//#include <mutex>
//#include <condition_variable>
//#include <queue>
//
//const int MAX_STOCK = 10;
//struct Product {};
//std::queue<Product> _que;
//std::condition_variable _producer;
//std::condition_variable _consumer;
//std::mutex _mutex;
//
//void producer()
//{
//	while (1)
//	{
//		std::unique_lock<std::mutex> lock(_mutex);
//		_producer.wait(lock, [] {
//			return _que.size() < MAX_STOCK;
//			});
//		_que.push(Product());
//		lock.unlock();
//		_consumer.notify_one();
//	}
//}
//
//void consumer()
//{
//	while (1)
//	{
//		std::unique_lock<std::mutex> lock(_mutex);
//		_consumer.wait(lock, [] {
//			return _que.size() > 0;
//			});
//		_que.pop();
//		lock.unlock();
//		_producer.notify_one();
//	}
//}
//
//int main()
//{
//	const int numProducers = 5;
//	const int numConsumers = 5;
//	std::thread producers[numProducers];
//	std::thread consumers[numConsumers];
//
//	for (int i = 0; i < numProducers; ++i)
//		producers[i] = std::thread(producer);
//
//	for (int i = 0; i < numConsumers; ++i)
//		consumers[i] = std::thread(consumer);
//
//	for (int i = 0; i < numProducers; ++i)
//		producers[i].join();
//
//	for (int i = 0; i < numConsumers; ++i)
//		consumers[i].join();
//
//	return 0;
//}

#include <iostream>
#include <vector>

using namespace std;

class B0 {
public:
	virtual void display()
	{
		cout << "0" << endl;
	}
};

class B1 : public B0 {
public:
	void display()
	{
		cout << "1" << endl;
	}
};

class B2 : public B1 {
public:
	void display()
	{
		cout << "2" << endl;
	}
};

void func(B0 ptr)
{
	ptr.display();
}

int main()
{
	B2 b;
	func(b);
	return 0;
}

//void swap(int& x, int& y)
//{
//	int tmp = x;
//	x = y;
//	y = tmp;
//}
//
//void quickSort(vector<int>& arr, int left, int right)
//{
//	if (left >= right)
//		return;
//	int keyi = left;
//	int cur = left + 1, prev = left;
//	while (cur <= right)
//	{
//		if (arr[cur] < arr[keyi] && ++prev != cur)
//			swap(arr[prev], arr[cur]);
//		++cur;
//	}
//	swap(arr[prev], arr[keyi]);
//	keyi = prev;
//	quickSort(arr, left, keyi - 1);
//	quickSort(arr, keyi + 1, right);
//}
//
//int main()
//{
//	vector<int> arr = { 5, 3, 8, 4, 2 };
//	quickSort(arr, 0, arr.size() - 1);
//
//	for (int i : arr)
//		cout << i << " ";
//
//	return 0;
//}











